package cn.tedu.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.List;

@Component // 将当前类交给Spring管理
public class My02Filter implements GlobalFilter, Ordered {//Ordered  用于获取优先级

    /**
     * ServerWebExchange exchange 获取请求的信息
     * GatewayFilterChain chain 获取下一个过滤器：
     * 在 Spring Cloud Gateway 中，GatewayFilterChain 代表过滤器链，它负责管理和执行一系列的网关过滤器（Gateway Filters）。具体来说：
     * 过滤器链管理：当你为网关配置了多个过滤器时，GatewayFilterChain 会按照顺序组织和执行这些过滤器。
     * 请求处理流程：当一个请求到达网关时，它会通过过滤器链中的每个过滤器，每个过滤器可以对请求进行修改、检查或执行其他逻辑。
     * 链式调用：在自定义过滤器中，你需要调用 chain.filter(exchange) 来将请求传递给下一个过滤器。如果不调用这个方法，请求就不会继续向下传递，可能导致请求无法到达目标服务。
     * 响应处理：过滤器链也处理响应，允许在响应返回给客户端之前对其进行修改
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("进入我的第二个过滤器");
        //1. 获取请求对象
        ServerHttpRequest request = exchange.getRequest();
        //2. 获取uri相关信息（路径相关）
        URI uri = request.getURI();
        System.out.println("获取到请求uri:"+uri);
        String path = uri.getPath();//获取路径
        System.out.println("获取到请求path:"+path);
        String host = uri.getHost();//获取host
        System.out.println("获取到请求host:"+host);
        String query = uri.getQuery();//获取query
        System.out.println("获取到请求query:"+query);
        int port = uri.getPort();
        System.out.println("获取到请求port:"+port);
        //3. 获取query相关的数据 （参数相关）
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        if (!queryParams.isEmpty()){//判断是否为空
            if (queryParams.containsKey("name")){//判断是否包含name
                List<String> names = queryParams.get("name");
                if (!CollectionUtils.isEmpty(names)){
                    System.out.println("query中包含的name");
                    System.out.println("query中name的值为:"+names);
                }
            }
        }
        // 4. 获取请求头
        HttpHeaders headers = request.getHeaders();
        List<String> authorizations = headers.get("Authorization");
        if (!CollectionUtils.isEmpty(authorizations)){
            System.out.println("请求头中包含的authorizations");
            System.out.println("authorizations中对应的value值为:"+authorizations);
        }
        //5. 获取请求cookie
        MultiValueMap<String, HttpCookie> cookies = request.getCookies();
        if (cookies.containsKey("token")){
            List<HttpCookie> token = cookies.get("token");
            if (!CollectionUtils.isEmpty(token)){
                System.out.println("请求中包含的token");
                System.out.println("token中value值为:"+token);
            }
        }
        return chain.filter(exchange);//让这个请求正常通过
    }

    /**
     * 可以获取优先级
     * @return
     */
    @Override
    public int getOrder() {
        return 10; // 返回一个数字，数字越小，优先级越高
    }
}
